package com.aop.SpElAop.DistributedLock.RedisLock;

/**
 * @Package: com.aop.SpElAop.Lock
 * @ClassName: DistributedLock
 * @Author: h2cloud
 * @CreateTime: 2024/7/9 10:06 下午
 * @Description:
 */
import com.aop.SpElAop.DistributedLock.RedisLock.LockType.LockType;

import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface RedisLock {
	/**
	 * 锁名
	 * 前缀 + SpEL 表达式解析之后的文本
	 * @return 默认空值
	 */
	String name() default "";

	/**
	 * 锁的 key
	 * 支持 SpEL 表达式，如：#param.id
	 *
	 * @return SpEL 表达式原文
	 */
	String key() default "";

	/**
	 * 尝试加锁，最多等待时间，时间单位以 unit 为准
	 * 默认值（-1）：不等待
	 *
	 * @return 默认-1
	 */
	long waitTime() default -1;

	/**
	 * 加锁以后多久自动解锁，时间单位以 unit 为准
	 * 默认值（-1）：默认30秒，Redisson自动续期
	 * 其它值：按填写的值到期自动解锁，Redisson不会自动续期
	 *
	 * @return 默认-1
	 */
	long leaseTime() default -1;

	/**
	 * 时间单位
	 *
	 * @return 默认秒
	 */
	TimeUnit unit() default TimeUnit.SECONDS;

	/**
	 * 锁类型，
	 * 如：可重入锁、公平锁、读锁、写锁
	 *
	 * @return 默认可重入锁
	 */
	LockType lockType() default LockType.REENTRANT;

	/**
	 * 是否联锁（多把锁合为一个锁操作），
	 * 可以在操作List类型锁使用，把List里的值合为一个锁。
	 *
	 * @return true-是联锁，false-非联锁
	 */
	boolean isMultiLock() default false;

	/**
	 * 是否尝试加锁，
	 * true-尝试加锁，等待 waitTime 时间，无论成功还是失败都会返回；
	 * false-阻塞加锁，直到完成加锁才返回。
	 *
	 * @return true-尝试加锁，false-阻塞加锁
	 */
	boolean isTryLock() default true;
}

